// 导入工具函数，包括判断空值、显示成功提示、克隆对象和消息提示函数
import { isNull, showSuccess, clone, msg, showError } from '/@/utils';
// 导入常量枚举
import { enumCode } from '/@/const';
// 导入确认对话框钩子函数
import { useConfirmDialog } from '/@/hooks';
// 导入血型复核相关的 API 和数据类型
import { TraFuHeInput, TraFuHeApi, TraFuHeOutput } from '/@/api/tra/TraFuHe';
import { TraShenQingDanOutput } from '/@/api/tra/TraShenQing';
import { ElMessage } from 'element-plus';

// 定义一个函数，返回独立实例状态
export function useTraXueXingFuHe() {
	// 定义各个组件的引用
	const mkPatientFormRef = ref();
	const billPanelRef = ref();
	const formRef = ref();
	const listRef = ref();
	const editPageRef = ref();
	const shenQingDanRef = ref();

	const containerRef = ref<HTMLElement | null>(null);
	const containerWidth = ref(0);

	const ctxProps: Ref<{ shenQingDanInfo?: TraShenQingDanOutput }> = ref({});
	/**
	 * 初始化 props
	 * @param props 传入的 props 对象
	 */
	const initProps = (props: { shenQingDanInfo?: TraShenQingDanOutput }) => {
		ctxProps.value = props;
	};
	// 定义emits
	const ctxEmits = ref<Function>(() => { });
	// 接收emits
	const initEmits = (emits: Function) => {
		ctxEmits.value = emits;
	};
	/**
	 * 初始化上下文对象
	 * @returns 包含初始状态的上下文对象
	 */
	const initialState = () => ({
		// 标识是否处于编辑状态
		isEdit: true,
		// 标识是否正在加载数据
		loading: false,
		// 主表数据，默认单据类型为血型复核
		zhuBiao: { danJuLeiXing: '血型复核' } as TraFuHeInput,
		// 明细表格数据，血型复核可能不需要，但为了兼容保留
		mingXiTable: [] as any[],
	});

	// 使用 reactive 初始化响应式上下文对象
	const ctx = reactive(initialState());

	//  ============================================= 主表 ====================================
	/**
	 * 清空表单数据，初始化实体
	 */
	const newEntity = () => {
		// 将上下文对象重置为初始状态
		Object.assign(ctx, initialState());
		// 设置为编辑状态
		ctx.isEdit = true;
		// 让扫码框获得焦点（如果有的话）
		// 如果有病人表单，也初始化它
		mkPatientFormRef.value?.newEntity();
		console.log('leqaqin -prop', ctxProps);
		ctx.zhuBiao.id = ctxProps.value.shenQingDanInfo?.traShenQing?.id ?? '';
	};

	/**
	 * 列表 -- 查看按钮的处理函数，加载实体数据
	 * @param row 主表数据
	 */
	const loadEntity = (row: any) => {
		// 检查主表数据或其 ID 是否为空，若为空则直接返回
		if (isNull(row) || isNull(row.id)) {
			return;
		}
		ctx.loading = true
		// 调用血型复核 API 的 get 方法获取数据
		TraFuHeApi.get(row.id).then((res) => {
			// 重置表单字段
			formRef.value?.resetFields();
			if (isNull(res?.id)) {
				ctx.zhuBiao.id = row.id;
				ctx.isEdit = true;
			} else {
				// 将获取到的主表数据赋值给上下文对象的主表属性
				ctx.zhuBiao = res as TraFuHeInput;
				// 设置为非编辑状态
				ctx.isEdit = false;
			}
		}).finally(() => ctx.loading = false)
	};
	/**
	 * 切换单据为修改状态
	 * @returns 
	 */
	const edit = () => {
		ctx.isEdit = true;
	};

	/**
	 * 提交表单数据
	 */
	const submit = async () => {
		// 进行表单验证
		const validate = await formRef?.value?.validate();
		// 若验证不通过则直接返回
		if (!validate) return;

		// 设置加载状态
		ctx.loading = true;
		try {
			if (isNull(ctxProps.value.shenQingDanInfo?.traShenQing.id)) {
				showError('不存在申请单信息！')
				return
			}
			// 若主表 ID 为空，说明是新增操作
			if (isNull(ctx.zhuBiao.danJuZhuangTai)) {
				// 设置单据状态为已生效（如果需要的话）
				// ctx.zhuBiao.danJuZhuangTai = enumCode.Djzt.已生效;
				// 调用血型复核 API 的 add 方法添加数据
				const params = {
					...ctx.zhuBiao,
					id: ctxProps.value.shenQingDanInfo?.traShenQing.id as string
				}
				ctx.loading = true
				const res = await TraFuHeApi.add(params).finally(() => ctx.loading = false);
				ctx.zhuBiao = res
				ctxEmits.value('submitCallBack', res.id)
				ElMessage.success('保存成功');
			} else {
				// 更新操作
				ctx.zhuBiao.danJuZhuangTai = enumCode.Djzt.已生效;
				await TraFuHeApi.update(ctx.zhuBiao);
				showSuccess('更新成功');
			}
			// 设置为非编辑状态
			ctx.isEdit = false;
		} catch (error) {
			console.error('提交失败', error);
			msg.error('提交失败');
		} finally {
			// 无论成功失败，都取消加载状态
			ctx.loading = false;
		}
	};

	/**
	 * 作废单据
	 */
	const cancel = () => {
		// 显示确认对话框
		useConfirmDialog('确认作废吗?').then(() => {
			// 设置单据状态为已作废
			ctx.zhuBiao.danJuZhuangTai = enumCode.Djzt.已作废;
			// 调用作废接口
			TraFuHeApi.update(ctx.zhuBiao).then(() => {
				// 显示作废成功提示
				showSuccess('已作废');
			});
		});
	};

	/**
	 * 打印操作
	 */
	const print = () => {
		// 调用单据面板组件的 printWeb 方法进行打印
		billPanelRef.value?.printWeb('billno', 'detail');
		// 显示打印成功提示
		showSuccess('打印');
	};

	/**
	 * 获取申请单
	 */
	const handleGetShenQing = (shenQingDan: any) => {
		console.log('获取申请单', shenQingDan);
	};

	// 写一个判断单据状态的计算属性并且传出去
	const isCanEdit = computed(() => {
		return ctx.zhuBiao.danJuZhuangTai === enumCode.Djzt.已生效 || ctx.zhuBiao.danJuZhuangTai === enumCode.Djzt.已作废;
	});

	/**
	 * 工具类，这是给抽屉长度的
	 */
	const setupContainerWidthLogic = () => {
		const updateContainerWidth = () => {
			if (containerRef.value) {
				containerWidth.value = containerRef.value.offsetWidth;
			}
		};

		onMounted(() => {
			updateContainerWidth();
			window.addEventListener('resize', updateContainerWidth);
		});

		onUnmounted(() => {
			window.removeEventListener('resize', updateContainerWidth);
		});
	};

	return {
		mkPatientFormRef,
		billPanelRef,
		formRef,
		listRef,
		editPageRef,
		shenQingDanRef,
		containerRef,
		containerWidth,
		ctxProps,
		initProps,
		initEmits,
		ctx,
		newEntity,
		loadEntity,
		edit,
		submit,
		cancel,
		print,
		handleGetShenQing,
		isCanEdit,
		setupContainerWidthLogic
	};
}
